package com.ssy.lingxi.order.service.openapi;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.api.model.openapi.request.*;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.bo.OrderDeliveryBO;
import com.ssy.lingxi.order.model.bo.OrderProductCheckBO;
import com.ssy.lingxi.order.model.bo.OrderReceiveBO;
import com.ssy.lingxi.order.service.base.IBaseOrderDeliveryService;

import java.util.List;

/**
 * OpenApi - 订单相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-10-16
 */
public interface IOrderOpenApiService {
    /**
     * 创建订单（单个订单）
     * @param orderVO 接口参数
     * @return 创建结果
     * @see com.ssy.lingxi.order.service.web.IOrderCreationService
     */
    Wrapper<Void> createOpenApiOrder(OpenApiOrderVO orderVO);

    /**
     * 校验、生成订单商品
     * @param order    订单
     * @param products 订单商品列表
     * @param isCreate 新增订单-true, 修改订单-false
     * @return 订单总金额，是否需要物流
     * @see com.ssy.lingxi.order.service.base.IBaseOrderProductService
     */
    Wrapper<OrderProductCheckBO> checkOpenApiOrderProduct(OrderDO order, List<OpenApiProductVO> products, boolean isCreate);

    /**
     * 校验、生成订单工作流
     * @param order 订单
     * @return 校验结果
     */
    Wrapper<Void> checkOrderProcessTask(OrderDO order);

    /**
     * 校验、生成订单发票
     * @param order 订单
     * @param invoiceVO 订单发票接口参数
     * @param isCreate 是否新增，true-新增，false-修改
     * @return 校验结果
     * @see com.ssy.lingxi.order.service.base.IBaseOrderInvoiceService
     */
    Wrapper<Void> checkOrderInvoice(OrderDO order, OpenApiInvoiceVO invoiceVO, boolean isCreate);

    /**
     * 校验并生成订单收货人信息
     * @param order       订单
     * @param consigneeVO 订单收货人接口参数
     * @param isCreate 是否新增，true-新增，false-修改
     * @return 操作结果
     * @see com.ssy.lingxi.order.service.base.IBaseOrderConsigneeService
     */
    Wrapper<Void> checkOrderConsignee(OrderDO order, OpenApiConsigneeVO consigneeVO, boolean isCreate);

    /**
     * 校验并生成订单其他要求
     * @param order         订单
     * @param requirements 其他要求接口参数
     * @param isCreate 是否新增，true-新增，false-修改
     * @return 检查结果
     * @see com.ssy.lingxi.order.service.base.IBaseOrderRequirementService
     */
    Wrapper<Void> checkOrderRequirement(OrderDO order, OpenApiRequirementVO requirements, boolean isCreate);

    /**
     * 订单发货
     * @param deliveryVO 接口参数
     * @return 操作结果
     * @see com.ssy.lingxi.order.service.web.IVendorOrderService
     */
    Wrapper<Void> deliveryOrder(OpenApiOrderDeliveryVO deliveryVO);

    /**
     * 校验、生成发货记录，判断工作流跳转条件
     * @param order      订单
     * @param deliveryVO 接口参数
     * @return 发货结果
     * @see com.ssy.lingxi.order.service.base.IBaseOrderDeliveryService
     */
    Wrapper<OrderDeliveryBO> checkVendorOrderDelivery(OrderDO order, OpenApiOrderDeliveryVO deliveryVO);

    /**
     * 确认收货
     * @param receiveVO 接口参数
     * @return 收货结果
     * @see com.ssy.lingxi.order.service.web.IBuyerOrderService
     */
    Wrapper<Void> receiveOrder(OpenApiOrderReceiveVO receiveVO);

    /**
     * 校验、生成收货数据，判断工作流跳转条件
     * @param order  订单
     * @param batchNo 发货批次
     * @return 收货结果
     * @see IBaseOrderDeliveryService
     */
    Wrapper<OrderReceiveBO> checkBuyerOrderReceive(OrderDO order, Integer batchNo);
}
